package edu.scnu.fans.fingertip.common.api;

import java.lang.reflect.Array;

/**
 * API 返回对象（基类）
 *
 */
public class ApiResponse<T> {

	/** 返回代码 */
	private int code;

	/** 返回消息 */
	private String msg;

	/** 返回数据*/
	private T data;

	public ApiResponse() {
		super();
		this.code = 200;
		this.msg = "操作成功";
	}

	/**
	 * code -> 200
	 * 
	 * @param data 需要结构体类型
	 */
	public ApiResponse(T data) {
		this(200, "操作成功", data);
	}

	/**
	 * @param code 返回代码
	 * @param msg  返回消息
	 * @param data 返回数据
	 */
	public ApiResponse(Integer code, String msg, T data) {
		super();
		checkData(data);

		this.code = code;
		this.msg = msg;
		this.data = data;
	}

	/**
	 * 结构体检查
	 */
	private void checkData(T data) {
		if (data == null)
			throw new IllegalArgumentException("响应数据不能为空");

		if (Iterable.class.isAssignableFrom(data.getClass())         // 不接受列表, 请包装
				|| Array.class.isAssignableFrom(data.getClass())     // 不接受数组, 请包装
				|| Number.class.isAssignableFrom(data.getClass())    // 不接受数字, 请包装
				|| Boolean.class.isAssignableFrom(data.getClass())   // 不接受布尔值, 请包装
				|| String.class.isAssignableFrom(data.getClass())    // 不接受字符串, 请包装
				|| Character.class.isAssignableFrom(data.getClass()) // 不接受字符, 请包装
				)
			throw new IllegalArgumentException("响应数据只接受Key-Value结构体");
	}

	public void setCode(int code) {
		this.code = code;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public void setData(T data) {
		this.data = data;
	}

	/**
	 * @return 代码
	 */
	public int getCode() {
		return code;
	}

	/**
	 * @return 消息
	 */
	public String getMsg() {
		return msg;
	}

	/**
	 * @return 数据
	 */
	public T getData() {
		return data;
	}

}
